"""
可以像调用属性的方式调用方法
创建property的方式：
    1. 装饰器@property、@方法名.setter、@方法名.deleter
    2. 类属性创建
"""


class Foo(object):
    """类属性创建property"""

    def get_bar(self):
        print("getter...")
        return "fauks"

    def set_bar(self, value):
        print("setter...")
        return 'set value' + value

    def del_bar(self):
        print("deleter...")
        return "xxx"

    # 创建property
    BAR = property(get_bar, set_bar, del_bar, "描述")


class Goods(object):
    """使用装饰器创建property属性"""

    def __init__(self) -> None:
        self.original_price = 100
        self.discount = 0.8

    @property
    def price(self):
        """如果只需要获取值仅需要该方法即可"""
        return self.original_price * self.discount

    @price.setter
    def price(self, value):
        """如果要设置值使用该方法，使用xxx.price=200时调用该方法"""
        self.original_price = value

    @price.deleter
    def price(self):
        """删除属性时调用"""
        del self.original_price


class Pager(object):
    """property属性应用1"""

    def __init__(self, current_page) -> None:
        self.current_page = current_page
        self.page_size = 10

    @property
    def start(self):
        """返回起始页"""
        val = (self.current_page - 1) * self.page_size
        return val

    @property
    def end(self):
        """返回结束页"""
        val = self.current_page * self.page_size
        return val


class Money(object):
    """property应用2：优化getter、setter方法"""

    def __init__(self) -> None:
        # 定义私有属性
        self.__money = 0

    def get_money(self):
        return self.__money

    def set_money(self, value):
        # 判断是否是int
        if isinstance(value, int):
            self.__money = value
        else:
            print("请传入int类型")

    # 可以调用get_money、set_money方法获取、设置值比较麻烦
    # 使用property简化getter、setter方法
    money = property(get_money, set_money)


def main():
    pager = Pager(2)
    # 像调用属性一样调用方法，不能用()调用
    print(pager.start)
    print(pager.end)

    # 使用装饰器创建property
    goods = Goods()
    goods.price = 200
    print(goods.price)

    # 测试使用类属性创建property
    foo = Foo()
    foo.BAR = "slx"
    print(foo.BAR)
    # 打印BAR中的描述信息(第四个参数)
    print(Foo.BAR.__doc__)
    del foo.BAR

    m = Money()
    m.money = 1
    print(m.money)


if __name__ == '__main__':
    main()
